﻿using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Options;
using System.Reflection;

namespace CleanLite.DynamicApi
{
    /// <summary>
    /// 动态 API 控制器功能提供者，用于判断类型是否应被识别为控制器。
    /// </summary>
    /// <remarks>
    /// 继承自 <see cref="ControllerFeatureProvider"/>。
    /// <para>
    /// 通过重写 <see cref="IsController(TypeInfo)"/> 方法，
    /// 使普通的类（例如实现了 <see cref="IDynamicApi"/> 的类）
    /// 也能被 MVC 框架识别并注册为控制器。
    /// </para>
    /// </remarks>
    /// <param name="customControllerFeature">
    /// 控制器识别策略对象，用于在构造时注入自定义判断逻辑。
    /// </param>
    internal class DynamicApiControllerFeatureProvider(IOptions<DynamicApiOptions> options) : ControllerFeatureProvider
    {
        private readonly DynamicApiOptions options = options.Value;

        protected override bool IsController(TypeInfo typeInfo)
        {
            //排除空、非IDynamicApi继承者、非类、非公共、抽象、泛型 为控制器
            if (typeInfo == null || !typeof(IDynamicApi).IsAssignableFrom(typeInfo) || !typeInfo.IsClass || !typeInfo.IsPublic || typeInfo.IsAbstract || typeInfo.IsGenericTypeDefinition)
            {
                return false;
            }
            //执行自定义控制器识别逻辑
            return options.CustomControllerFeatureProvider.IsController(typeInfo);
        }
    }
}